When debugging a process executing on a remote computer, typically information has to be passed back and forth several times between the two computers because neither computer has all the information it needs for the debug operation. Suppose for example, a client computer is debugging a process executing on a server computer. Suppose the user is stopped at a breakpoint and wants to evaluate an expression in the debuggee process. Several pieces of state in the remote process such as register values, or other information stored in memory, has to be obtained in order for an expression evaluator on the local machine to evaluate the expression. If each time a piece of state is read from the remote machine, a request is sent and the user has to wait for a response, the process of debugging can be very slow. For example, evaluation of the expression “a+b+c+d” would involve at a minimum 4 round trips across the network to complete.
Alternatively, the expression could be evaluated completely on the remote machine. This would entail having the expression evaluator, the language-specific components and all the symbolic information on the remote computer. This approach typically involves sending large files over the network. Moreover, it may not even be possible to copy all the language-specific components to the remote machine, because, for example, permissions are lacking, or because the language components are not compatible with the operating system or processor of the remote machine.